iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0

摘要

內容回顧

  • 對於沒有玩過看板的人來說,就可能不知道我在做什麼,所以下面是白話文
    • 在某個叫做 Asana 的網站上,有我們部門裡面的工作記錄
    • 同事們平常要去更新自己做了什麼工作
    • 有職業道德的同事,會把細節寫進去,避免後人不小心踩到雷
    • 職場老油條的話,就習慣偷偷留好幾手,寫自己才看得懂的天書
    • 因為看板上面的東西,都是商業機密
      • 所以人類,大多都是透過瀏覽器輸入帳號密碼登入,進行查看和修改
      • 然而,程式,也可以拿著一塊令牌來表明身份,透過 Asana 官方所提供的工具 (SDK),來存取敝司的商業機密看板
  • 如果正在閱讀的你覺得有點看不懂的話,那就退到本系列的第五篇 - Day 5 - 準備投影片資料,認識看板流與 Asana API

開發流程

  • 昨天一口氣看了數十隻 API,不知道各位有沒有實際動手操作了?
  • 我還沒急著進行開發,是想知道工具箱裡面有哪些工具,是可以有效解決問題
  • 因為 Asana 已經有提供可以線上測試 API 的網站,所以要照這篇操作的人,勢必都要反反覆覆地在網站上操作餵參數取回資料判斷資料是否如預期拿回資料處理後當成呼叫下一回合 API 的參數
  • 這就是昨天那篇裡面所寫的七個 API,點下昨天那篇文章的連結,分別去嘗試這幾個操作

開發程式

  • 附上本日原始碼:
import asana
import configparser
from asana.rest import ApiException


class Kanban():

    def __init__(self) -> None:

        # Configure OAuth2 access token for authorization: oauth2
        configuration = asana.Configuration()
        config = configparser.ConfigParser()
        config.read('config.ini')
        configuration.access_token = config['Asana']['asana_token']
        # create an instance of the API class
        self.client = asana.ApiClient(configuration)
        self.workspaces = None
        self.projects = None
        self.tasks = None
        self.get_all()

    def get_workspaces(self):
        try:
            # create an instance of the API class
            api_instance = asana.WorkspacesApi(self.client)
            # Get multiple workspaces
            api_response = api_instance.get_workspaces()
            data = api_response.to_dict()['data']
            self.workspaces = [ d['gid'] for d in data ]
        except ApiException as e:
            print("Exception when calling WorkspacesApi->get_workspaces: %s\n" % e)

    def get_all(self):
        self.get_workspaces()
        # self.get_projects()
        # self.get_tasks()
  • 這份程式碼,扣掉註解和空白行,剩不到 30 行
  • 因為不長,所以建議花點時間一行一行慢慢看

引用模組

  1. import asana
    • 昨天裝好的工具,就是 Asana 提供的工具箱
  2. import configparser
    • 昨天提到,不要把密碼或是令牌之類的東西,寫在程式碼裡面
    • 現在使用版本控制來管理程式碼版本,已經是稀鬆平常的事情
    • 所以切記要小心,養成習慣不要亂丟密碼
    • 這個工具可以從外部檔案讀取設定檔、暫時先從檔案 config.ini 讀取
    • 未來程式擺到別人家的時候,我也不推薦這個做法
  3. from asana.rest import ApiException
    • 看名字裡面有 Exception 就是在做例外處理的

製作類別 Kanban 建構子

  1. 在昨天玩了一大串 API 後,發現有很多共通點:
    • 都要吃 Token
    • 都要建立出 client 用來和 Asana 先做連線
    • 從 client 裡面提供的方法,取回資料...在不同個 API 呼叫中,雖然概念類似,但是開始會拿回不同的東西了
    • 就是拿環保杯去飲料店買飲料,拿環保餐盒去便當店買便當的概念
  2. 所以,我在 建構子函式 init()
    • 先把負責跑腿去買東西的外送員接上線
    • 再告訴外送員我的我的身份,去買東西的時候直接嗆我的名號就行
    • 給他空的餐盒和空的飲料杯

製作 Kanban 類別內的方法 get_workspaces()

  1. get_workspaces() 為例,因為後續要陸續取回很多資料,但是外送員只要請一個就好了,差別就在於叫他去什麼店買什麼東西而已
  2. 把不同的部分寫在函式裡面
  3. 昨天有提到,取回的內容可能是特殊格式,我期待它變成 python built-in data type,所以才用他們提供的 to_dict()
  4. 我只關注裡面的 data,所以弄成 data = api_response.to_dict()['data']
  5. 變個小把戲 self.workspaces = [ d['gid'] for d in data ],這邊用到 list generator 蒐集迭代資料內特定索引的值,看不懂沒關係,看久了就習慣了
  6. 例外處理的部分就不要亂改

結論


上一篇
Day 6 - 從閱讀 Asana API 文件進行功能設計
下一篇
Day 8 - 實作 Kanban 類別、取得 Asaba 工作區、團隊、專案的方法
系列文
挽救肝指數 x 職場生存術 x 老闆愛看的投影片製造機30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言